package compilador;

import compilador.lexico.AnalisadorLexico;
import compilador.lexico.LeitorEntrada;
import compilador.lexico.LexicoException;
import compilador.lexico.Token;
import java.io.*;

/**
 * Classe principal, inicia a execução do programa.
 *
 * @author Carlos H V Pinto
 * @author Lucas S Bueno
 */
public class Main {

    public static void main(String[] args) {
        InputStream entrada = null;
        PrintStream saida = null;

        try {
            // Cria os fluxos de entrada e saída em arquivo
            entrada = new FileInputStream(args[0]);
            saida = new PrintStream(new FileOutputStream(args[1]));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // Redefine entrada e saída padrão
        System.setIn(entrada);
        System.setOut(saida);
        System.setErr(saida);

        // Cria o gerenciador de leitor de arquivo e o analisador léxico 
        LeitorEntrada leitor = new LeitorEntrada();
        AnalisadorLexico lexico = new AnalisadorLexico(leitor);

        // Chama repetidamente o analisador léxico para ler um token por vez
        while (!leitor.terminou()) {
            try {
                // Lê o token e imprime sua representação
                Token token = lexico.proximoToken();

                // O token é null quando for lido um comentário
                if (token != null) {
                    System.out.println(token);
                }
            } catch (LexicoException erro) {
                // Imprime o erro
                System.err.println(erro.getMessage());
            }
        }

        // Fecha os fluxos de entrada e saída
        try {
            entrada.close();
            saida.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
